const Koa = require('koa');
const bodyParser = require('koa-bodyparser');
const cors = require('@koa/cors');
const helmet = require('koa-helmet');
const json = require('koa-json');
const { koaSwagger } = require('koa2-swagger-ui');
const swaggerSpec = require('./config/swagger');
const routes = require('./routes');
const sequelize = require('./config/database');
const { errorHandler } = require('./middlewares/errorHandler');
const { logger } = require('./utils/logger');

const app = new Koa();

// 错误处理
app.use(async (ctx, next) => {
  try {
    await next();
  } catch (err) {
    ctx.status = err.status || 500;
    ctx.body = {
      status: 'error',
      message: err.message
    };
    ctx.app.emit('error', err, ctx);
  }
});

// 安全中间件
app.use(helmet({
  contentSecurityPolicy: false
}));

// 启用CORS
app.use(cors());

// 请求体解析
app.use(bodyParser());

// 格式化JSON响应
app.use(json());

// 错误处理中间件
app.use(errorHandler);

// Swagger文档
app.use(
  koaSwagger({
    routePrefix: '/docs',
    swaggerOptions: {
      url: '/swagger.json',
    },
    hideTopbar: true,
    title: 'ManageX API 文档',
    lang: 'zh-cn',
  })
);

// 挂载所有路由
app.use(routes.routes());
app.use(routes.allowedMethods());

// 数据库连接
sequelize
  .authenticate()
  .then(() => {
    logger.info('Connected to MySQL database');
    // 同步数据库模型（在开发环境中）
    if (process.env.NODE_ENV === 'development') {
      return sequelize.sync({ alter: true });
    }
  })
  .then(() => {
    if (process.env.NODE_ENV === 'development') {
      logger.info('Database models synchronized');
    }
  })
  .catch((err) => {
    logger.error('Database connection error:', err);
    process.exit(1);
  });

// 未捕获异常的处理
process.on('uncaughtException', (err) => {
  logger.error('Uncaught Exception:', err);
  process.exit(1);
});

// 未处理的Promise异常处理
process.on('unhandledRejection', (err) => {
  logger.error('Unhandled Rejection:', err);
  process.exit(1);
});

module.exports = app; 